【アップデート情報】テーブルの変更履歴を取得するCHANGES関数が新たに追加されました
Google Cloudデータエンジニアのはんざわです。
2024年7月22日のアップデートでCHANGES
のテーブル関数がプレビューとして、新たに追加されました。
本ブログでは、追加されたばかりのCHANGES
のテーブル関数を触ってみたいと思います。
CHANGES とは?
CHANGES
のテーブル関数では、BigQueryのテーブル変更履歴を追跡することができます。
BigQueryのコンソール画面からSQLで指定した時間範囲に行われた特定の種類の変更を確認することができます。
似たようなテーブル関数にAPPENDS
が存在します。
APPENDS
とCHANGES
では、取得可能な情報が若干異なります。
APPENDS
で取得可能な情報は次の通りです。
CREATE TABLE
のDDLステートメントINSERT
のDMLステートメントMERGE
のDMLステートメントで追加されたデータ- BigQueryへのデータロード
- ストリーミングによるデータの取り込み
同様にCHANGES
で取得可能な情報は次の通りです。
CREATE TABLE
のDDLステートメントINSERT
のDMLステートメントMERGE
のDMLステートメントで変更されたデータUPDATE
のDMLステートメントDELETE
のDMLステートメント- BigQueryへのデータロード
- ストリーミングによるデータの取り込み
TRUNCATE TABLE
のDMLステートメントWRITE_TRUNCATE
で構成されたジョブ- 個々のテーブルのパーティションの削除
これらを比較して分かるようにCHANGES
はAPPENDS
よりも多くの変更情報を取得することが可能になっています。
さっそくですが、CHANGES
を触ってみたいと思います。
CHANGES を触ってみる
CHANGES(
TABLE table,
start_timestamp DEFAULT NULL,
end_timestamp)
CHANGES
の使い方は非常に簡単です。
上記のようにTABLE
にテーブル名を与え、テーブルの変更履歴を確認したい期間をstart_timestamp
とend_timestamp
に与えるだけで確認することができます。
start_timestamp
には、NULL
を指定することも可能でテーブル作成以降の全てのテーブルの変更履歴を取得することが可能です。
一方でend_timestamp
には、少なくとも現在の時刻から10分前である必要があり、start_timestamp
とend_timestamp
の間の最大時間範囲は1日である必要があるようです。
end_timestamp
に現在の時刻から10分以内の時刻を与えると次のようなエラーが発生することを確認しています。
試しに適当なテーブルの変更履歴を以下のクエリで確認してみます。
SELECT
*
FROM
CHANGES(
TABLE samples.github_nested,
TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 1 DAY),
TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 15 MINUTE)
)
ですが、実行すると以下のようなエラーが発生しました。
どうやらテーブルの変更履歴を確認するためには、enable_change_history
のオプションをTRUE
にする必要があるようです。
別途、以下のクエリでenable_change_history
のオプションを有効にしたテーブルを作成し、変更履歴を確認してみたいと思います。
CREATE TABLE samples.change_history
OPTIONS (
> enable_change_history = TRUE
) AS
SELECT
1 AS id,
'apple' AS name
また、INSERT
とUPDATE
とDELETE
ステートメントも実行してみます。
/* INSERT Statement */
INSERT INTO samples.change_history
SELECT
2 AS id,
'banana' AS name
/* UPDATE Statement */
UPDATE samples.change_history
SET
name = 'melon'
WHERE
id = 2
/* DELETE Statement */
DELETE samples.change_history
WHERE
id = 2
改めて以下のクエリで変更履歴を確認してみます。
SELECT
*
FROM
CHANGES (
TABLE `samples.change_history`,
TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 1 DAY),
TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 15 MINUTE)
)
全てのデータ操作が以下のキャプチャのように確認することができました!
料金について
変更履歴を確認するためにenable_change_history
をTRUE
に設定すると、BigQueryはテーブルの変更メタデータを保存するようになります。
このメタデータの保存には、BigQueryのストレージコストが発生するようになります。
通常であれば少額で済みますが、変更操作が多いテーブルや大規模なテーブルのデータ操作は予想外の課金が発生する可能性があるので気をつけましょう。
まとめ
今回のブログでは、新たにプレビューで追加されたCHANGES
を紹介しました。
この機能を有効にすることでデータの更新履歴の管理が容易になると思われます。
追加で課金が発生するようになりますが、是非活用を検討してみてください。